﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;

namespace Lcsoft.UrlRewriter.Utilities
{
	/// <summary>
	/// 封装类型操作的常用方法。
	/// </summary>
	internal static class TypeHelper
	{
		/// <summary>
		/// 根据指定的包含程序集和类型信息的字符串和参数列表创建一个对象。
		/// </summary>
		/// <param name="fullTypeName">包含程序集和类型信息的字符串。</param>
		/// <param name="args">参数列表。</param>
		/// <returns>一个 <see cref="System.Object"/>。</returns>
		public static object Activate(string fullTypeName, object[] args) { return Activate<object>(fullTypeName, args); }

		/// <summary>
		/// 根据指定的包含程序集和类型信息的字符串和参数列表创建特定类型的新实例。
		/// </summary>
		/// <typeparam name="T">要获取的对象的类型。</typeparam>
		/// <param name="fullTypeName">包含程序集和类型信息的字符串。</param>
		/// <param name="args">参数列表。</param>
		/// <returns>如果创建成功则返回 <typeparamref name="T"/> 的新实例。</returns>
		public static T Activate<T>(string fullTypeName, object[] args)
		{
			var components = fullTypeName.Split(new[]{ ',' }, 2);

			if (components.Length != 2) throw new ArgumentOutOfRangeException("fullTypeName", fullTypeName, MessageProvider.FormatString(Message.FullTypeNameRequiresAssemblyName));

			return Activate<T>(components[1].Trim(), components[0].Trim(), args);
		}

		/// <summary>
		/// 根据指定的程序集、类型名称和参数列表创建特定类型的新实例。
		/// </summary>
		/// <typeparam name="T">要获取的对象的类型。</typeparam>
		/// <param name="assemblyName">程序集名称。</param>
		/// <param name="typeName">类型名称。</param>
		/// <param name="args">参数列表。</param>
		/// <returns>如果创建成功则返回 <typeparamref name="T"/> 的新实例。</returns>
		public static T Activate<T>(string assemblyName, string typeName, object[] args)
		{
			if (assemblyName.Length == 0) throw new ArgumentOutOfRangeException("assemblyName", assemblyName, MessageProvider.FormatString(Message.AssemblyNameRequired));
			if (typeName.Length == 0) throw new ArgumentOutOfRangeException("typeName", typeName, MessageProvider.FormatString(Message.TypeNameRequired));

			return (T)(AppDomain.CurrentDomain.CreateInstanceAndUnwrap(assemblyName, typeName, false, 0, null, args, null, null));
		}
	}
}
